From 26d36b5c4236881470c7325e09ffbca4db53a197 Mon Sep 17 00:00:00 2001 From: Debian OpenLDAP Maintainers Date: Fri, 28 Jul 2017 02:04:41 +0100 Subject: [PATCH] libldap-symbol-versions Add symbol versioning to the public LDAP libraries. This is required for library transitions, such as the current transition from 2.1 to 2.4, since programs will sometimes have both libraries loaded by different dependency chains during the transition. Not yet contributed upstream. Upstream ITS #5365 filed requesting symbol versioning for libldap and libber. Gbp-Pq: Name libldap-symbol-versions --- build/openldap.m4 | 51 +++++++++++++++++++++++++++++++++ build/top.mk | 5 +++- configure.in | 7 +++++ libraries/liblber/Makefile.in | 3 ++ libraries/liblber/liblber.map | 8 ++++++ libraries/libldap/Makefile.in | 3 ++ libraries/libldap/libldap.map | 7 +++++ libraries/libldap_r/Makefile.in | 3 ++ 8 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 libraries/liblber/liblber.map create mode 100644 libraries/libldap/libldap.map diff --git a/build/openldap.m4 b/build/openldap.m4 index 38fbbf6a..7b9d2cc3 100644 --- a/build/openldap.m4 +++ b/build/openldap.m4 @@ -1142,3 +1142,54 @@ AC_DEFUN([OL_SSL_COMPAT], #endif ], [ol_cv_ssl_crl_compat=yes], [ol_cv_ssl_crl_compat=no])]) ]) + +dnl ==================================================================== +dnl check for symbol versioning support +AC_DEFUN([OL_SYMBOL_VERSIONING], +[AC_CACHE_CHECK([for .symver assembler directive], + [ol_cv_asm_symver_directive],[ +cat > conftest.s <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + ol_cv_asm_symver_directive=yes +else + ol_cv_asm_symver_directive=no +fi +rm -f conftest*]) +AC_CACHE_CHECK([for ld --version-script], + [ol_cv_ld_version_script_option],[ +if test $ol_cv_asm_symver_directive = yes; then + cat > conftest.s < conftest.map <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $LDFLAGS -shared + -o conftest.so conftest.o + -Wl,--version-script,conftest.map + 1>&AS_MESSAGE_LOG_FD]); + then + ol_cv_ld_version_script_option=yes + else + ol_cv_ld_version_script_option=no + fi + else + ol_cv_ld_version_script_option=no + fi +else + ol_cv_ld_version_script_option=no +fi +rm -f conftest*])]) diff --git a/build/top.mk b/build/top.mk index a558a663..b9809d7a 100644 --- a/build/top.mk +++ b/build/top.mk @@ -104,6 +104,9 @@ LTFLAGS_MOD = $(@PLAT@_LTFLAGS_MOD) # LINK_LIBS referenced in library and module link commands. LINK_LIBS = $(MOD_LIBS) $(@PLAT@_LINK_LIBS) +# option to pass to $(CC) to support library symbol versioning, if any +VERSION_OPTION = @VERSION_OPTION@ + LTSTATIC = @LTSTATIC@ LTLINK = $(LIBTOOL) --mode=link \ @@ -113,7 +116,7 @@ LTCOMPILE_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(LIB_DEFS) -c LTLINK_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=link \ - $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) + $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) $(VERSION_FLAGS) LTCOMPILE_MOD = $(LIBTOOL) $(LTONLY_MOD) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(MOD_DEFS) -c diff --git a/configure.in b/configure.in index 3c181549..a0a513fe 100644 --- a/configure.in +++ b/configure.in @@ -1916,6 +1916,13 @@ else fi AC_SUBST(LTSTATIC)dnl +VERSION_OPTION="" +OL_SYMBOL_VERSIONING +if test $ol_cv_ld_version_script_option = yes ; then + VERSION_OPTION="-Wl,--version-script=" +fi +AC_SUBST(VERSION_OPTION) + dnl ---------------------------------------------------------------- if test $ol_enable_wrappers != no ; then AC_CHECK_HEADERS(tcpd.h,[ diff --git a/libraries/liblber/Makefile.in b/libraries/liblber/Makefile.in index 73ab47d5..1c95475d 100644 --- a/libraries/liblber/Makefile.in +++ b/libraries/liblber/Makefile.in @@ -38,6 +38,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLUTIL_A) XXLIBS = NT_LINK_LIBS = $(AC_LIBS) UNIX_LINK_LIBS = $(AC_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(srcdir)/liblber.map" +endif dtest: $(XLIBS) dtest.o $(LTLINK) -o $@ dtest.o $(LIBS) diff --git a/libraries/liblber/liblber.map b/libraries/liblber/liblber.map new file mode 100644 index 00000000..b54853c0 --- /dev/null +++ b/libraries/liblber/liblber.map @@ -0,0 +1,8 @@ +OPENLDAP_2.4_2 { + global: + ber_*; + der_alloc; + lutil_*; + local: + *; +}; diff --git a/libraries/libldap/Makefile.in b/libraries/libldap/Makefile.in index 3fe85d2f..895ec4c2 100644 --- a/libraries/libldap/Makefile.in +++ b/libraries/libldap/Makefile.in @@ -52,6 +52,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLBER_LA) $(LDAP_LIBLUTIL_A) XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = $(VERSION_OPTION)$(srcdir)/libldap.map +endif apitest: $(XLIBS) apitest.o $(LTLINK) -o $@ apitest.o $(LIBS) diff --git a/libraries/libldap/libldap.map b/libraries/libldap/libldap.map new file mode 100644 index 00000000..605dcffa --- /dev/null +++ b/libraries/libldap/libldap.map @@ -0,0 +1,7 @@ +OPENLDAP_2.4_2 { + global: + ldap_*; + ldif_*; + local: + *; +}; diff --git a/libraries/libldap_r/Makefile.in b/libraries/libldap_r/Makefile.in index e8ae22a6..97442b2a 100644 --- a/libraries/libldap_r/Makefile.in +++ b/libraries/libldap_r/Makefile.in @@ -61,6 +61,9 @@ XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) XXXLIBS = $(LTHREAD_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) $(LTHREAD_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(XXDIR)/libldap.map" +endif .links : Makefile @for i in $(XXSRCS); do \ -- 2.30.2